package com.kktoolbox.engine;

import com.kktoolbox.entity.DecumentSearchResult;
import com.kktoolbox.model.SearchProgressCallback;
import com.kktoolbox.utils.DocumentUtils;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * PDF文档搜索引擎核心类
 * 
 * @author KK-Toolbox
 * @version 1.0.0
 * @since 2025-01-01
 */
public class PDFSearchEngine extends AbstractDocumentSearchEngine {
    
    /** 支持的PDF文件扩展名 */
    private static final String PDF_EXTENSION = "pdf";
    
    @Override
    protected String getDocumentType() {
        return "PDF";
    }
    
    @Override
    protected boolean isSupportedFile(File file) {
        return DocumentUtils.hasExtension(file, PDF_EXTENSION);
    }
    
    @Override
    protected boolean containsText(File file, String searchText) {
        String extractedText = extractTextFromPDF(file);
        if (extractedText == null || extractedText.trim().isEmpty()) {
            return false;
        }
        
        // 不区分大小写的文本匹配
        return DocumentUtils.containsTextIgnoreCase(extractedText, searchText);
    }

    /**
     * 从PDF文件中提取文本内容
     * 
     * <p>使用Apache PDFBox库提取PDF文档的所有文本内容。
     * 该方法会处理多页PDF文档，提取所有页面的文本。</p>
     * 
     * @param pdfFile PDF文件
     * @return 提取的文本内容，如果提取失败则返回null
     */
    private String extractTextFromPDF(File pdfFile) {
        if (!DocumentUtils.isReadableFile(pdfFile)) {
            logger.warn("PDF文件不可读: {}", DocumentUtils.getAbsolutePath(pdfFile));
            return null;
        }
        
        try (PDDocument document = PDDocument.load(pdfFile)) {
            if (document.isEncrypted()) {
                logger.warn("PDF文件已加密，跳过: {}", DocumentUtils.getAbsolutePath(pdfFile));
                return null;
            }
            
            PDFTextStripper stripper = new PDFTextStripper();
            String text = stripper.getText(document);
            
            logger.debug("成功提取PDF文本，文件: {}, 文本长度: {} 字符", 
                        DocumentUtils.getAbsolutePath(pdfFile), 
                        text != null ? text.length() : 0);
            
            return text;
            
        } catch (IOException e) {
            logger.error("提取PDF文本时发生错误: {} - {}", 
                        DocumentUtils.getAbsolutePath(pdfFile), e.getMessage());
            return null;
        } catch (Exception e) {
            logger.error("处理PDF文件时发生未知错误: {} - {}", 
                        DocumentUtils.getAbsolutePath(pdfFile), e.getMessage());
            return null;
        }
    }

    /**
     * 获取PDF文档的页数
     * 
     * <p>返回PDF文档的总页数，用于统计信息显示。</p>
     * 
     * @param pdfFile PDF文件
     * @return PDF文档的页数，如果无法获取则返回0
     */
    public int getPageCount(File pdfFile) {
        if (!DocumentUtils.isReadableFile(pdfFile)) {
            return 0;
        }
        
        try (PDDocument document = PDDocument.load(pdfFile)) {
            if (document.isEncrypted()) {
                logger.warn("PDF文件已加密，无法获取页数: {}", DocumentUtils.getAbsolutePath(pdfFile));
                return 0;
            }
            
            return document.getNumberOfPages();
            
        } catch (IOException e) {
            logger.error("获取PDF页数时发生错误: {} - {}", 
                        DocumentUtils.getAbsolutePath(pdfFile), e.getMessage());
            return 0;
        } catch (Exception e) {
            logger.error("处理PDF文件时发生未知错误: {} - {}", 
                        DocumentUtils.getAbsolutePath(pdfFile), e.getMessage());
            return 0;
        }
    }
}